{"componentChunkName":"component---src-templates-blog-post-js","path":"/javascript/width(web-api)/","result":{"data":{"site":{"siteMetadata":{"title":"Tory","author":"[Tory]","siteUrl":"https://gatsby-starter-bee.netlify.com","comment":{"disqusShortName":"","utterances":"JaeYeopHan/gatsby-starter-bee"},"sponsor":{"buyMeACoffeeId":"jbee"}}},"markdownRemark":{"id":"26b704dc-1109-5996-b128-71959ea28bad","excerpt":"web API가 제공하는 여러가지 width 값에 대해서 이번에 반응형으로 slick(carousel)을 구현하며 겪은 문제가 있다.\n브라우저의 크기가 변경되면 slick이 한 화면에 보여주는 슬라이드의 수가 유동적으로 변하게 되는데,\nslick은 마지막 페이지에 도달하면 다음 페이지로 이동하지 못하게 막아야하므로\n다음 처럼 총 6개의 슬라이드가 있다고 가정한다면\n2개의 슬라이드씩 넘어갈 때는 3번을 넘길 수 있지만, 3개의 슬라이드가 넘어갈 때는 2번만 넘어가도록 만들어야 했다. 예시…","html":"<h1 id=\"web-api가-제공하는-여러가지-width-값에-대해서\" style=\"position:relative;\"><a href=\"#web-api%EA%B0%80-%EC%A0%9C%EA%B3%B5%ED%95%98%EB%8A%94-%EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80-width-%EA%B0%92%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C\" aria-label=\"web api가 제공하는 여러가지 width 값에 대해서 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>web API가 제공하는 여러가지 width 값에 대해서</h1>\n<p>이번에 반응형으로 slick(carousel)을 구현하며 겪은 문제가 있다.\n브라우저의 크기가 변경되면 slick이 한 화면에 보여주는 슬라이드의 수가 유동적으로 변하게 되는데,\nslick은 마지막 페이지에 도달하면 다음 페이지로 이동하지 못하게 막아야하므로\n다음 처럼 총 6개의 슬라이드가 있다고 가정한다면\n2개의 슬라이드씩 넘어갈 때는 3번을 넘길 수 있지만, 3개의 슬라이드가 넘어갈 때는 2번만 넘어가도록 만들어야 했다.</p>\n<p><strong>예시</strong></p>\n<ul>\n<li>\n<p>2 slides on one page</p>\n<div style=\"text-align:center\">\n  <img src=\"/e21e379e1a98d5eaeb70a35552de4ac7/slick3.gif\">\n</div>\n</li>\n<li>\n<p>3 slides on one page</p>\n<div style=\"text-align:center\">\n  <img src=\"/56b6da661729113cc928793d4c4fdfc6/slick2.gif\">\n</div>\n</li>\n</ul>\n<h2 id=\"문제점\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C%EC%A0%90\" aria-label=\"문제점 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제점</h2>\n<p>본인은 screen.window.availWidth를 사용해 구현했고 availWidth를 사용했을 때 아래와 같이 문제가 있었다.</p>\n<ol>\n<li>브라우저(윈도우)의 크기에 따라서 slick의 전체 page 수가 변동되어야 하는데, 변하지 않았다. 슬라이드의 개수가 3개일 때 1/2로 표기되는 것은 옳지만, 슬라이드의 개수가 2개일 떄는 1/3으로 표기되어야 정상이다. 하지만 아래 처럼 1/2로 고정되어있음을 알 수 있다.</li>\n</ol>\n<div style=\"text-align:center\">\n  <img src=\"/ea0550289da1009d64f69ecfae9598ff/pageProblem1.gif\">\n</div>\n<ol start=\"2\">\n<li>devTools에서 해상도를 변경할때는 정상적으로 page 수가 변동된다.</li>\n</ol>\n<div style=\"text-align:center\">\n  <img src=\"/bbb6fc96fc7284c2f9daee117fa1c735/pageProblem2.gif\">\n</div>\n<p>왜 이 같은 문제가 발생하는지 찾아보았고 그 해답은 web api의 특성에 있었다.</p>\n<h2 id=\"web-apis\" style=\"position:relative;\"><a href=\"#web-apis\" aria-label=\"web apis permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>web APIS</h2>\n<ol>\n<li>window.screen.width</li>\n</ol>\n<p>window.screen.width는 모니터의 해상도이다. 따라서 노트북, 모바일 등 해상도가 다른 디바이스마다 값이 다르다.</p>\n<p>하지만 같은 디바이스에서는 <strong>죽었다 깨어나도 값</strong>이 바뀔일이 없다.</p>\n<ol start=\"2\">\n<li>window.screen.availWidth</li>\n</ol>\n<p>본인이 햇갈렸던 api다. api 이름으로만 보면 브라우저의 크기에 따라 그 값이 변동되는 것처럼 느껴지지만 실상은 그렇지 않다.</p>\n<p>window.screen.width와 성질은 같다. 역시나 모니터 해상도에 따라 값이 정해지며, 다만 상단의 툴바와 같은 영역을 제외하고 screen size가 결정된다. 주의할 점은 <strong>브라우저의 크기를 줄여도</strong> 무조건 <strong>모니터의 해상도</strong>가 기준이 되어 툴바 영역을 배제한다는 점이다.</p>\n<ul>\n<li>툴바를 제외하는 window.screen.availHeight와 window.screen.height의 예시</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">'availHeight: '</span><span class=\"token punctuation\">,</span>\n  window<span class=\"token punctuation\">.</span>screen<span class=\"token punctuation\">.</span>availHeight<span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'height: '</span><span class=\"token punctuation\">,</span>\n  window<span class=\"token punctuation\">.</span>screen<span class=\"token punctuation\">.</span>height\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// availHeight: 1050 height: 1080</span></code></pre></div>\n<ol start=\"3\">\n<li>window.innerWidth</li>\n</ol>\n<p>innerWidth는 브라우저 윈도우 창틀(외부 영역)을 제외한 크기를 표시한다. 반대로 window.outerWidth는 창틀까지 포함한 영역을 크기다.</p>\n<h2 id=\"slick에-적용할-web-api는\" style=\"position:relative;\"><a href=\"#slick%EC%97%90-%EC%A0%81%EC%9A%A9%ED%95%A0-web-api%EB%8A%94\" aria-label=\"slick에 적용할 web api는 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>slick에 적용할 web API는?</h2>\n<p>디바이스의 크기가 아니라 브라우저의 크기에 따라 slide의 개수가 정해지기 때문에, window.innerWidth를 사용해야 한다.</p>\n<h2 id=\"구현\" style=\"position:relative;\"><a href=\"#%EA%B5%AC%ED%98%84\" aria-label=\"구현 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>구현</h2>\n<p>React에서 커스텀 훅에 window.innerWidth를 사용해 봤다.\nresize 이벤트는 window의 크기가 변할 때 트리거 된다. resize 이벤트와 window.innerWidth를 함께 사용하면 문제를 해결할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useEffect<span class=\"token punctuation\">,</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">useWindowWidth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>windowWidth<span class=\"token punctuation\">,</span> setWindowWidth<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>innerWidth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resize'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setWindowWidth</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>innerWidth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>windowWidth<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> windowWidth<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>","frontmatter":{"title":"width(web api)","date":"September 13, 2021"}}},"pageContext":{"slug":"/javascript/width(web-api)/","previous":{"fields":{"slug":"/css/vertical-aline/"},"frontmatter":{"title":"vertical-align","category":"css","draft":false}},"next":{"fields":{"slug":"/javascript/module/"},"frontmatter":{"title":"module","category":"javascript","draft":false}}}},"staticQueryHashes":["3128451518","521680639"]}